package com.brooks.demo.program.p1;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * 面试题
 * 实现一个容器，提供两个方法，add,size
 * 写两个线程，线程1往容器里添加10个元素，线程2实现监控元素的个数，当个数到5时，线程2给出提示并结束
 *
 * 该demo有问题，会出现t2在读完数据到下次读取数据期间，t1添加了5，并且添加了6或者更多，这时t2读取的数据跳过5，就变成死循环了
 * @Author mihutu
 * @Date 2020/10/20 11:11
 * @Version 1.0
 */
public class DemoWithoutVolatile {
    /**这里使用同步容器来保证数据一致,否则会出现脏读的情况*/
    volatile List list = Collections.synchronizedList(new LinkedList<>());

    public void add(Object o) {
        list.add(o);
    }

    public int size() {
        return list.size();
    }

    public static void main(String[] args) {
        DemoWithoutVolatile v = new DemoWithoutVolatile();
        //监控数量的线程
        new Thread(()->{
            while (true){
                if(v.size()==5){
                    break;
                }
            }
            System.out.println("已经到5了，我结束了");
        },"t2").start();
        //添加元素的线程
        new Thread(()->{
            for (int i=0;i<10;i++){
                v.add(new Object());
                System.out.println("添加了第"+i+"个元素");
            }
        },"t1").start();

    }
}
